package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import CONEXAO.Conexao;
import CORE.GenericDAO;
import DTO.UsuarioDTO;

public class UsuarioDAO extends GenericDAO<UsuarioDTO>{

	public UsuarioDAO() {
		super("usuario", UsuarioDTO.class);
	}

	public List<UsuarioDTO> pesquisarPorLogin(UsuarioDTO usuarioDTO){
		try {
			List<UsuarioDTO> usuarios = new ArrayList<>();
            Connection conn = Conexao.conectar(BANCO);
            StringBuilder sql = new StringBuilder();                        
            sql.append("SELECT * FROM ");
            sql.append(tabela);
            sql.append(" WHERE login LIKE ?");
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            ps.setString(1, "%"+usuarioDTO.getLogin()+"%");
            
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
            	usuarios.add(criarObjeto(rs));
            }
                        
            rs.close();
            ps.close();
            
            conn.close();
            
            return usuarios;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public boolean existe(UsuarioDTO usuarioDTO){
		try {
			UsuarioDTO usuario = null;
            Connection conn = Conexao.conectar(BANCO);
            StringBuilder sql = new StringBuilder();                        
            sql.append("SELECT * FROM ");
            sql.append(tabela);
            sql.append(" WHERE login = ?");
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            ps.setString(1, usuarioDTO.getLogin());
            
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
            	usuario = criarObjeto(rs);
            }
                        
            rs.close();
            ps.close();
            
            conn.close();
            
			return usuario != null;
		} catch (Exception e) {
			return false;
		}
	}
	
	public UsuarioDTO logar(UsuarioDTO usuarioDTO){
		try {
			UsuarioDTO usuario = null;
            Connection conn = Conexao.conectar(BANCO);
            StringBuilder sql = new StringBuilder();                        
            sql.append("SELECT * FROM ");
            sql.append(tabela);
            sql.append(" WHERE login = ? ");
            sql.append(" AND senha = ?");
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            ps.setString(1, usuarioDTO.getLogin());
            ps.setString(2, usuarioDTO.getSenha());
            
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
            	usuario = criarObjeto(rs);
            }
                        
            rs.close();
            ps.close();
            
            conn.close();
            
			return usuario;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	@Override
	public UsuarioDTO criarObjeto(ResultSet rs) throws SQLException {
		UsuarioDTO usuario = new UsuarioDTO();
		usuario.setCodigo(rs.getLong(1));
		usuario.setLogin(rs.getString(2));
		usuario.setSenha(rs.getString(3));
		return usuario;
	}

	@Override
	public void setarPSExcluir(PreparedStatement ps, UsuarioDTO usuario) throws SQLException {
		ps.setLong(1, usuario.getCodigo());	
	}

	@Override
	public void setarPSAlterar(PreparedStatement ps, UsuarioDTO usuario) throws SQLException {
		setarPSIncluir(ps, usuario);
		ps.setLong(3, usuario.getCodigo());
	}

	@Override
	public void setarPSIncluir(PreparedStatement ps, UsuarioDTO usuario) throws SQLException {		
		ps.setString(1, usuario.getLogin());
		ps.setString(2, usuario.getSenha());
	}	
}